import { http } from '@/api/service/request'

/**
 * 案例分页查询参数
 */
export interface CaseQueryDTO {
  /** 页码 */
  page?: number
  /** 每页大小 */
  size?: number
  /** 案例名称 */
  name?: string
  /** 案例类型 */
  type?: string
  /** 案例难度 */
  difficulty?: number
  /** 案例状态 */
  status?: number
}

/**
 * 案例数据
 */
export interface CaseDTO {
  /** ID */
  nodeId?: string
  /** 案例名称 */
  name?: string
  /** 案例描述 */
  description?: string
  /** 案例封面 */
  cover?: string
  /** 案例类型 */
  type?: string
  /** 案例难度 */
  difficulty?: number
  /** 案例状态 */
  status?: number
  /** 审核消息 */
  auditMessage?: string
  /** 审核人 */
  auditor?: string
  /** 创建时间 */
  createTime?: string
  /** 更新时间 */
  updateTime?: string
  /** 创建人 */
  createdById?: string
  /** 更新人 */
  updatedById?: string
  /** 创建人username */
  createdByUsername?: string
  /** 更新人username */
  updatedByUsername?: string
  /** 颜色 */
  color?: string
  /** 大小 */
  size?: number
}

/**
 * 组件数据
 */
export interface ComponentDTO {
  /** ID */
  nodeId?: string
  /** 组件名称 */
  name?: string
  /** 组件描述 */
  description?: string
  /** 组件内容 */
  content?: string
  /** 创建时间 */
  createTime?: string
  /** 更新时间 */
  updateTime?: string
}

/**
 * 文件数据
 */
export interface FileInfoVo {
  /** 文件ID */
  fileId?: string
  /** 文件名称 */
  filename?: string
  /** 文件URL */
  url?: string
  /** 文件路径 */
  filepath?: string
  /** 文件类型 */
  fileType?: string
  /** 文件大小 */
  fileSize?: number
  /** 下载次数 */
  downloadCount?: number
  /** 创建时间 */
  createTime?: string
  /** 更新时间 */
  updateTime?: string
}

/**
 * 知识点数据
 */
export interface KnowledgeDTO {
  /** ID */
  nodeId?: string
  /** 知识点名称 */
  name?: string
  /** 知识点描述 */
  description?: string
  /** 难度级别 */
  level?: number
  /** 知识点标签 */
  tags?: string[]
  /** 知识点摘要 */
  summary?: string
}

/**
 * 完整案例详情
 */
export interface CaseDetailDTO {
  /** 案例信息 */
  caseInfo: CaseDTO
  /** 组件列表 */
  components: ComponentDTO[]
  /** 组件对应的文件映射关系 */
  componentFiles: Record<string, FileInfoVo[]>
  /** 组件对应的知识点映射关系 */
  componentKnowledge: Record<string, KnowledgeDTO[]>
}

/**
 * 审核案例DTO
 */
export interface CaseAuditDTO {
  /** 审核结果 */
  passed: boolean
  /** 审核意见 */
  auditMessage?: string
}

/**
 * 获取案例分页列表
 */
export const getCasePage = (params: CaseQueryDTO = {
  page: 1,
  size: 12,
}) => {
  return http.request<{
    code: number,
    message: string,
    data: {
      content: CaseDTO[]
      totalElements: number
      size: number
      number: number
      totalPages: number
      first: boolean
      last: boolean
      empty: boolean
    }
  }>('post', '/case/list', { data: params })
}

/**
 * 获取案例详情
 */
export const getCaseDetail = (nodeId: string) => {
  return http.request<{
    code: number,
    message: string,
    data: CaseDTO
  }>('get', `/case/${nodeId}`)
}

/**
 * 获取完整案例详情（包含案例信息、组件列表、文件和知识点）
 */
export const getCompleteCaseDetail = (nodeId: string) => {
  return http.request<{
    code: number,
    message: string,
    data: CaseDetailDTO
  }>('get', `/case/${nodeId}/complete`)
}

/**
 * 创建案例
 */
export const createCase = (data: CaseDTO) => {
  return http.request<{
    code: number,
    message: string,
    data: CaseDTO
  }>('post', '/case', { data })
}

/**
 * 更新案例
 */
export const updateCase = (data: CaseDTO) => {
  if (!data.nodeId) {
    throw new Error('案例ID不能为空')
  }
  return http.request<{
    code: number,
    message: string,
    data: CaseDTO
  }>('put', `/case/${data.nodeId}`, { data })
}

/**
 * 删除案例
 */
export const deleteCase = (nodeId: string) => {
  return http.request<{
    code: number,
    message: string,
    data: null
  }>('delete', `/case/${nodeId}`)
}

/**
 * 获取所有案例类型
 */
export const getCaseTypes = () => {
  return http.request<{
    code: number,
    message: string,
    data: string[]
  }>('get', '/case/types')
}

/**
 * 提交案例审核
 */
export const submitCase = (nodeId: string) => {
  return http.request<{
    code: number,
    message: string,
    data: null
  }>('post', `/case/submit/${nodeId}`)
}

/**
 * 发布案例
 */
export const publishCase = (nodeId: string) => {
  return http.request<{
    code: number,
    message: string,
    data: null
  }>('post', `/case/publish/${nodeId}`)
}

/**
 * 下架案例
 */
export const unpublishCase = (nodeId: string) => {
  return http.request<{
    code: number,
    message: string,
    data: null
  }>('post', `/case/unpublish/${nodeId}`)
}

/**
 * 审核案例
 */
export const auditCase = (nodeId: string, auditDTO: CaseAuditDTO) => {
  return http.request<{
    code: number,
    message: string,
    data: null
  }>('post', `/case/audit/${nodeId}`, {
    data: auditDTO
  })
}
